home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / TTYDRIV.C < prev    next >
C/C++ Source or Header  |  1988-01-26  |  2KB  |  105 lines

  1. #include <stdio.h>
  2. /* TTY input driver */
  3. #define    NULLCHAR    (char *)NULL
  4.  
  5. int ttymode;
  6. #define TTY_COOKED    0
  7. #define    TTY_RAW    1
  8.  
  9. #define    LINESIZE    256
  10.  
  11. #define    CTLU    21
  12. #define CTLR    18
  13. #define    CTLZ    26
  14.  
  15. raw()
  16. {
  17.     ttymode = TTY_RAW;
  18. }
  19.  
  20. cooked()
  21. {
  22.     ttymode = TTY_COOKED;
  23. }
  24.  
  25. /* Accept characters from the incoming tty buffer and process them
  26.  * (if in cooked mode) or just pass them directly (if in raw mode).
  27.  * Returns the number of characters available for use; if non-zero,
  28.  * also stashes a pointer to the character(s) in the "buf" argument.
  29.  */
  30.  /*Control-R added by df for retype of lines - useful in Telnet */
  31.  
  32. int
  33. ttydriv(c,buf)
  34. char c;
  35. char **buf;
  36. {
  37.     static char linebuf[LINESIZE];
  38.     static char *cp = linebuf;
  39.     char *rp ;
  40.     int cnt;
  41.  
  42.     if(buf == (char **)NULL)
  43.         return 0;    /* paranoia check */
  44.  
  45.     cnt = 0;
  46.     switch(ttymode){
  47.     case TTY_RAW:
  48.         *cp++ = c;
  49.         cnt = cp - linebuf;
  50.         cp = linebuf;
  51.         break;
  52.     case TTY_COOKED:
  53.         /* Perform cooked-mode line editing */
  54.         switch(c & 0x7f){
  55.         case '\r':    /* CR and LF are equivalent */
  56.         case '\n':
  57.             *cp++ = '\r';
  58.             *cp++ = '\n';
  59.             printf("\n");
  60.             cnt = cp - linebuf;
  61.             cp = linebuf;
  62.             break;
  63.         case '\b':        /* Backspace */
  64.             if(cp != linebuf){
  65.                 cp--;
  66.                 printf("\b \b");
  67.             }
  68.             break;
  69.         case CTLR:    /* print line buffer */
  70.             printf("^R\n") ;
  71.             rp = linebuf ;
  72.             while (rp < cp)
  73.                 putchar(*rp++) ;
  74.             break ;
  75.         case CTLU:    /* Line kill */
  76.             while(cp != linebuf){
  77.                 cp--;
  78.                 printf("\b \b");
  79.             }
  80.             break;
  81.         default:    /* Ordinary character */
  82.             *cp++ = c;
  83. #ifndef    AMIGA
  84.             /* ^Z apparently hangs the terminal emulators under
  85.              * DoubleDos and Desqview. I REALLY HATE having to patch
  86.              * around other people's bugs like this!!!
  87.              */
  88.             if(c != CTLZ)
  89.                 putchar(c);
  90. #endif
  91.             if(cp >= &linebuf[LINESIZE]){
  92.                 cnt = cp - linebuf;
  93.                 cp = linebuf;
  94.             }
  95.             break;
  96.         }
  97.     }
  98.     if(cnt != 0)
  99.         *buf = linebuf;
  100.     else
  101.         *buf = NULLCHAR;
  102.     fflush(stdout);
  103.     return cnt;
  104. }
  105.